{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pytorch 支持 sklearn 的重参数搜索需要其他的库。一般的项目中设置好命令行脚本后，可以通过更改脚本参数手动实现超参数搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:20:45.636281500Z",
     "start_time": "2024-07-19T03:20:41.578825300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.9.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.2\n",
      "sklearn 1.5.0\n",
      "torch 2.3.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:20:50.163430300Z",
     "start_time": "2024-07-19T03:20:50.056570500Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _california_housing_dataset:\n",
      "\n",
      "California Housing dataset\n",
      "--------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      ":Number of Instances: 20640\n",
      "\n",
      ":Number of Attributes: 8 numeric, predictive attributes and the target\n",
      "\n",
      ":Attribute Information:\n",
      "    - MedInc        median income in block group\n",
      "    - HouseAge      median house age in block group\n",
      "    - AveRooms      average number of rooms per household\n",
      "    - AveBedrms     average number of bedrooms per household\n",
      "    - Population    block group population\n",
      "    - AveOccup      average number of household members\n",
      "    - Latitude      block group latitude\n",
      "    - Longitude     block group longitude\n",
      "\n",
      ":Missing Attribute Values: None\n",
      "\n",
      "This dataset was obtained from the StatLib repository.\n",
      "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n",
      "\n",
      "The target variable is the median house value for California districts,\n",
      "expressed in hundreds of thousands of dollars ($100,000).\n",
      "\n",
      "This dataset was derived from the 1990 U.S. census, using one row per census\n",
      "block group. A block group is the smallest geographical unit for which the U.S.\n",
      "Census Bureau publishes sample data (a block group typically has a population\n",
      "of 600 to 3,000 people).\n",
      "\n",
      "A household is a group of people residing within a home. Since the average\n",
      "number of rooms and bedrooms in this dataset are provided per household, these\n",
      "columns may take surprisingly large values for block groups with few households\n",
      "and many empty houses, such as vacation resorts.\n",
      "\n",
      "It can be downloaded/loaded using the\n",
      ":func:`sklearn.datasets.fetch_california_housing` function.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
      "      Statistics and Probability Letters, 33 (1997) 291-297\n",
      "\n",
      "(20640, 8)\n",
      "(20640,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "print(housing.DESCR)\n",
    "print(housing.data.shape)\n",
    "print(housing.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:20:55.356503800Z",
     "start_time": "2024-07-19T03:20:55.349888300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "array([[ 8.32520000e+00,  4.10000000e+01,  6.98412698e+00,\n",
      "         1.02380952e+00,  3.22000000e+02,  2.55555556e+00,\n",
      "         3.78800000e+01, -1.22230000e+02],\n",
      "       [ 8.30140000e+00,  2.10000000e+01,  6.23813708e+00,\n",
      "         9.71880492e-01,  2.40100000e+03,  2.10984183e+00,\n",
      "         3.78600000e+01, -1.22220000e+02],\n",
      "       [ 7.25740000e+00,  5.20000000e+01,  8.28813559e+00,\n",
      "         1.07344633e+00,  4.96000000e+02,  2.80225989e+00,\n",
      "         3.78500000e+01, -1.22240000e+02],\n",
      "       [ 5.64310000e+00,  5.20000000e+01,  5.81735160e+00,\n",
      "         1.07305936e+00,  5.58000000e+02,  2.54794521e+00,\n",
      "         3.78500000e+01, -1.22250000e+02],\n",
      "       [ 3.84620000e+00,  5.20000000e+01,  6.28185328e+00,\n",
      "         1.08108108e+00,  5.65000000e+02,  2.18146718e+00,\n",
      "         3.78500000e+01, -1.22250000e+02]])\n",
      "--------------------------------------------------\n",
      "array([4.526, 3.585, 3.521, 3.413, 3.422])\n"
     ]
    }
   ],
   "source": [
    "# print(housing.data[0:5])\n",
    "import pprint  #打印的格式比较 好看\n",
    "\n",
    "pprint.pprint(housing.data[0:5])\n",
    "print('-'*50)\n",
    "pprint.pprint(housing.target[0:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:20:59.097171100Z",
     "start_time": "2024-07-19T03:20:59.022453400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11610, 8) (11610,)\n",
      "(3870, 8) (3870,)\n",
      "(5160, 8) (5160,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "#拆分训练集和测试集，random_state是随机种子,同样的随机数种子，是为了得到同样的随机值\n",
    "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
    "    housing.data, housing.target, random_state = 7)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(\n",
    "    x_train_all, y_train_all, random_state = 11)\n",
    "# 训练集\n",
    "print(x_train.shape, y_train.shape)\n",
    "# 验证集\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "# 测试集\n",
    "print(x_test.shape, y_test.shape)\n",
    "\n",
    "dataset_maps = {\n",
    "    \"train\": [x_train, y_train],\n",
    "    \"valid\": [x_valid, y_valid],\n",
    "    \"test\": [x_test, y_test],\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:21:02.271531700Z",
     "start_time": "2024-07-19T03:21:02.257592200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "StandardScaler()",
      "text/html": "<style>#sk-container-id-1 {\n  /* Definition of color scheme common for light and dark mode */\n  --sklearn-color-text: black;\n  --sklearn-color-line: gray;\n  /* Definition of color scheme for unfitted estimators */\n  --sklearn-color-unfitted-level-0: #fff5e6;\n  --sklearn-color-unfitted-level-1: #f6e4d2;\n  --sklearn-color-unfitted-level-2: #ffe0b3;\n  --sklearn-color-unfitted-level-3: chocolate;\n  /* Definition of color scheme for fitted estimators */\n  --sklearn-color-fitted-level-0: #f0f8ff;\n  --sklearn-color-fitted-level-1: #d4ebff;\n  --sklearn-color-fitted-level-2: #b3dbfd;\n  --sklearn-color-fitted-level-3: cornflowerblue;\n\n  /* Specific color for light theme */\n  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n  --sklearn-color-icon: #696969;\n\n  @media (prefers-color-scheme: dark) {\n    /* Redefinition of color scheme for dark theme */\n    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n    --sklearn-color-icon: #878787;\n  }\n}\n\n#sk-container-id-1 {\n  color: var(--sklearn-color-text);\n}\n\n#sk-container-id-1 pre {\n  padding: 0;\n}\n\n#sk-container-id-1 input.sk-hidden--visually {\n  border: 0;\n  clip: rect(1px 1px 1px 1px);\n  clip: rect(1px, 1px, 1px, 1px);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n#sk-container-id-1 div.sk-dashed-wrapped {\n  border: 1px dashed var(--sklearn-color-line);\n  margin: 0 0.4em 0.5em 0.4em;\n  box-sizing: border-box;\n  padding-bottom: 0.4em;\n  background-color: var(--sklearn-color-background);\n}\n\n#sk-container-id-1 div.sk-container {\n  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n     but bootstrap.min.css set `[hidden] { display: none !important; }`\n     so we also need the `!important` here to be able to override the\n     default hidden behavior on the sphinx rendered scikit-learn.org.\n     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n  display: inline-block !important;\n  position: relative;\n}\n\n#sk-container-id-1 div.sk-text-repr-fallback {\n  display: none;\n}\n\ndiv.sk-parallel-item,\ndiv.sk-serial,\ndiv.sk-item {\n  /* draw centered vertical line to link estimators */\n  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n  background-size: 2px 100%;\n  background-repeat: no-repeat;\n  background-position: center center;\n}\n\n/* Parallel-specific style estimator block */\n\n#sk-container-id-1 div.sk-parallel-item::after {\n  content: \"\";\n  width: 100%;\n  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n  flex-grow: 1;\n}\n\n#sk-container-id-1 div.sk-parallel {\n  display: flex;\n  align-items: stretch;\n  justify-content: center;\n  background-color: var(--sklearn-color-background);\n  position: relative;\n}\n\n#sk-container-id-1 div.sk-parallel-item {\n  display: flex;\n  flex-direction: column;\n}\n\n#sk-container-id-1 div.sk-parallel-item:first-child::after {\n  align-self: flex-end;\n  width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:last-child::after {\n  align-self: flex-start;\n  width: 50%;\n}\n\n#sk-container-id-1 div.sk-parallel-item:only-child::after {\n  width: 0;\n}\n\n/* Serial-specific style estimator block */\n\n#sk-container-id-1 div.sk-serial {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: var(--sklearn-color-background);\n  padding-right: 1em;\n  padding-left: 1em;\n}\n\n\n/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\nclickable and can be expanded/collapsed.\n- Pipeline and ColumnTransformer use this feature and define the default style\n- Estimators will overwrite some part of the style using the `sk-estimator` class\n*/\n\n/* Pipeline and ColumnTransformer style (default) */\n\n#sk-container-id-1 div.sk-toggleable {\n  /* Default theme specific background. It is overwritten whether we have a\n  specific estimator or a Pipeline/ColumnTransformer */\n  background-color: var(--sklearn-color-background);\n}\n\n/* Toggleable label */\n#sk-container-id-1 label.sk-toggleable__label {\n  cursor: pointer;\n  display: block;\n  width: 100%;\n  margin-bottom: 0;\n  padding: 0.5em;\n  box-sizing: border-box;\n  text-align: center;\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n  /* Arrow on the left of the label */\n  content: \"▸\";\n  float: left;\n  margin-right: 0.25em;\n  color: var(--sklearn-color-icon);\n}\n\n#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n  color: var(--sklearn-color-text);\n}\n\n/* Toggleable content - dropdown */\n\n#sk-container-id-1 div.sk-toggleable__content {\n  max-height: 0;\n  max-width: 0;\n  overflow: hidden;\n  text-align: left;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content pre {\n  margin: 0.2em;\n  border-radius: 0.25em;\n  color: var(--sklearn-color-text);\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n  /* unfitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n  /* Expand drop-down */\n  max-height: 200px;\n  max-width: 100%;\n  overflow: auto;\n}\n\n#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n  content: \"▾\";\n}\n\n/* Pipeline/ColumnTransformer-specific style */\n\n#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator-specific style */\n\n/* Colorize estimator box */\n#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n#sk-container-id-1 div.sk-label label {\n  /* The background is the default theme color */\n  color: var(--sklearn-color-text-on-default-background);\n}\n\n/* On hover, darken the color of the background */\n#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n/* Label box, darken color on hover, fitted */\n#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n  color: var(--sklearn-color-text);\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Estimator label */\n\n#sk-container-id-1 div.sk-label label {\n  font-family: monospace;\n  font-weight: bold;\n  display: inline-block;\n  line-height: 1.2em;\n}\n\n#sk-container-id-1 div.sk-label-container {\n  text-align: center;\n}\n\n/* Estimator-specific */\n#sk-container-id-1 div.sk-estimator {\n  font-family: monospace;\n  border: 1px dotted var(--sklearn-color-border-box);\n  border-radius: 0.25em;\n  box-sizing: border-box;\n  margin-bottom: 0.5em;\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-0);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-0);\n}\n\n/* on hover */\n#sk-container-id-1 div.sk-estimator:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-2);\n}\n\n#sk-container-id-1 div.sk-estimator.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-2);\n}\n\n/* Specification for estimator info (e.g. \"i\" and \"?\") */\n\n/* Common style for \"i\" and \"?\" */\n\n.sk-estimator-doc-link,\na:link.sk-estimator-doc-link,\na:visited.sk-estimator-doc-link {\n  float: right;\n  font-size: smaller;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1em;\n  height: 1em;\n  width: 1em;\n  text-decoration: none !important;\n  margin-left: 1ex;\n  /* unfitted */\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n  color: var(--sklearn-color-unfitted-level-1);\n}\n\n.sk-estimator-doc-link.fitted,\na:link.sk-estimator-doc-link.fitted,\na:visited.sk-estimator-doc-link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\ndiv.sk-estimator:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link:hover,\n.sk-estimator-doc-link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\ndiv.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover,\ndiv.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n.sk-estimator-doc-link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n/* Span, style for the box shown on hovering the info icon */\n.sk-estimator-doc-link span {\n  display: none;\n  z-index: 9999;\n  position: relative;\n  font-weight: normal;\n  right: .2ex;\n  padding: .5ex;\n  margin: .5ex;\n  width: min-content;\n  min-width: 20ex;\n  max-width: 50ex;\n  color: var(--sklearn-color-text);\n  box-shadow: 2pt 2pt 4pt #999;\n  /* unfitted */\n  background: var(--sklearn-color-unfitted-level-0);\n  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n}\n\n.sk-estimator-doc-link.fitted span {\n  /* fitted */\n  background: var(--sklearn-color-fitted-level-0);\n  border: var(--sklearn-color-fitted-level-3);\n}\n\n.sk-estimator-doc-link:hover span {\n  display: block;\n}\n\n/* \"?\"-specific style due to the `<a>` HTML tag */\n\n#sk-container-id-1 a.estimator_doc_link {\n  float: right;\n  font-size: 1rem;\n  line-height: 1em;\n  font-family: monospace;\n  background-color: var(--sklearn-color-background);\n  border-radius: 1rem;\n  height: 1rem;\n  width: 1rem;\n  text-decoration: none;\n  /* unfitted */\n  color: var(--sklearn-color-unfitted-level-1);\n  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted {\n  /* fitted */\n  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n  color: var(--sklearn-color-fitted-level-1);\n}\n\n/* On hover */\n#sk-container-id-1 a.estimator_doc_link:hover {\n  /* unfitted */\n  background-color: var(--sklearn-color-unfitted-level-3);\n  color: var(--sklearn-color-background);\n  text-decoration: none;\n}\n\n#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n  /* fitted */\n  background-color: var(--sklearn-color-fitted-level-3);\n}\n</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>StandardScaler()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;StandardScaler<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div>"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "\n",
    "scaler = StandardScaler()\n",
    "scaler.fit(x_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构建数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:17.064013200Z",
     "start_time": "2024-07-19T03:23:17.044716500Z"
    }
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import Dataset\n",
    "\n",
    "class HousingDataset(Dataset):\n",
    "    def __init__(self, mode='train'):\n",
    "        self.x, self.y = dataset_maps[mode]\n",
    "        self.x = torch.from_numpy(scaler.transform(self.x)).float()\n",
    "        self.y = torch.from_numpy(self.y).float().reshape(-1, 1)\n",
    "            \n",
    "    def __len__(self):\n",
    "        return len(self.x)\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        return self.x[idx], self.y[idx]\n",
    "    \n",
    "    \n",
    "train_ds = HousingDataset(\"train\")\n",
    "valid_ds = HousingDataset(\"valid\")\n",
    "test_ds = HousingDataset(\"test\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-04-25T03:30:34.945253200Z",
     "start_time": "2024-04-25T03:30:34.894354300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "(tensor([-0.2981,  0.3523, -0.1092, -0.2506, -0.0341, -0.0060,  1.0806, -1.0611]),\n tensor([1.5140]))"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_ds[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:19.432013800Z",
     "start_time": "2024-07-19T03:23:19.429016200Z"
    }
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "\n",
    "\n",
    "batch_size = 256\n",
    "train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)\n",
    "val_loader = DataLoader(valid_ds, batch_size=batch_size, shuffle=False)\n",
    "test_loader = DataLoader(test_ds, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:39.794666Z",
     "start_time": "2024-07-19T03:23:39.783194200Z"
    }
   },
   "outputs": [],
   "source": [
    "#回归模型我们只需要1个数\n",
    "\n",
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self, input_dim=8):\n",
    "        super().__init__()\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(input_dim, 30),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(30, 1)\n",
    "            )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 8]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 1]\n",
    "        return logits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:42.681985400Z",
     "start_time": "2024-07-19T03:23:42.677980900Z"
    }
   },
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "        \n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else: \n",
    "            self.counter += 1\n",
    "            \n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:46.016606500Z",
     "start_time": "2024-07-19T03:23:46.011248200Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        \n",
    "    return np.mean(loss_list)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:23:50.575903700Z",
     "start_time": "2024-07-19T03:23:50.568497900Z"
    }
   },
   "outputs": [],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    " \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "\n",
    "                    # 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(-val_loss)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "                    \n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:29:07.523312600Z",
     "start_time": "2024-07-19T03:29:07.518804200Z"
    }
   },
   "outputs": [],
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=5):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        plt.plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        plt.plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        plt.grid()\n",
    "        plt.legend()\n",
    "        # plt.xticks(range(0, train_df.index[-1], 10*sample_step), range(0, train_df.index[-1], 10*sample_step))\n",
    "        plt.xlabel(\"step\")\n",
    "\n",
    "        plt.show()\n",
    "\n",
    "# plot_learning_curves(record)  #横坐标是 steps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "search"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-19T03:30:08.100476500Z",
     "start_time": "2024-07-19T03:29:14.422271900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "  0%|          | 0/4600 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "1a0a92e288d040f69ebce25bb09f9f3b"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 64 / global_step 2944\n",
      "lr: 0.01\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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8ePHQ5IkPPvsswFpmWjI448/joEDB+KFF17AzTffjPXr1+Odd97Bv//9bwDAwoULceTIEQwdOhSxsbFYtGgR7HY7unbtio0bN2LZsmUYPXo0kpKSsHHjRhQXF6Nbt25BKz/Qilo0gjzIloiIWrAnnngCSqUSPXr0QGJiYoNjLt58803Exsbikksuwfjx4zFmzBj069cvaOXs168fvvnmG8ybNw+9evXCzJkz8fzzz2Py5MkAgJiYGMyfPx/Dhw9H9+7d8f7772Pu3Lno2bMnoqKisGrVKowbNw5dunTB3/72N7zxxhu48sorg1Z+gC0aRETUCnXp0gXr16/3us315e2pffv27m4Il6lTp3pdr9uV4mv6aGOXFB82bFi9x19//fW4/vrrfW5/6aWXIicnx+d93bt3x+LFi+vdHswWGaAVtWjwDMZERETB12qCBhERUajdf//9iIiI8Pnv/vvvD3XxAoJdJ0REREHy/PPP44knnvB5X1RUVJBLExwMGkREREGSlJSEpKSkUBcjqNh1QkRERAHDoEFEREQB41fQsNlsePbZZ9GhQweEhYWhY8eOeOGFF4J+JrimuACKSEREJDt+jdH4+9//jvfeew+fffYZevbsiS1btuCuu+5CdHQ0Hn744UCVkYiIiC5QfgWNdevWYcKECbjqqqsAOBYymTt3LjZt2tTgY0wmE0wmk/u669S0FosFFoulKWX2ybWvhvYphL1ZjycHv1dn5I315T/WmX8uxPqyWCwQQsButwd9ISigdnEsVxno952vzux2O4QQsFgs7nOpuDT1delX0Ljkkkvw4Ycf4uDBg+jSpQt27tyJNWvW4M0332zwMa+88gpmz55d7/YlS5ZAr9f7X+LfsXTp0jq3OJ7iiRMnsGjR+U/r21rVrzM6H9aX/1hn/rmQ6kulUiElJQWVlZW/e0bTQKqoqAjq8Xr37o0HHngADzzwwO9uGxsbiy+//NL9R3pL4avOzGYzampqsGrVKlitVq/7qqurm3Qcv4LG008/DYPBgG7dukGpVMJms+Gll17CpEmTGnzMjBkzMH36dPd1g8GA9PR0jB49ulnnDFssFixduhSjRo3yOj3vI+uXAADatm2LceN6Ndvx5KChOiPfWF/+Y53550KsL6PRiIKCAkRERECn0wX9+EIIVFRUIDIysllOE99YCoUCOp2u0d9jYWFhLWadjPPVmdFoRFhYGIYOHVrv9+nqkfCXX0Hjm2++wVdffYU5c+agZ8+e2LFjBx599FGkpaXhzjvv9PkYrVYLrVZb73a1Wh2QN1JD+5UkxQXzxg22QP0u5Ir15T/WmX8upPqy2WyQJAkKhQIKRfAnMrqa/l1lCCZ/jhmq+vHlfHWmUCggSZLP12BTX5N+Pesnn3wSTz/9NG655RZkZWXhjjvuwGOPPYZXXnmlSQcnIiKZEQIwVwX3n6XacdnI6YUffvgh0tLS6o1PmDBhAu6++27k5eVhwoQJSE5ORkREBAYOHIjffvut2apo9+7dGD58OMLCwhAfH497770XlZWV7vtzcnIwaNAghIeHIyYmBkOGDMGxY8cAADt37sQVV1yByMhIREVFoX///tiyZUuzlS0Q/GrRqK6urpd+lErlBTEAhydVIyIKAks18HJa0A6nABDjuvLMKUAT/ruPufHGG/HQQw9hxYoVGDFiBADg7NmzWLx4MRYtWoTKykqMGzcOL730ErRaLT7//HOMHz8eubm5aNeu3R8qb1VVFcaMGYPs7Gxs3rwZRUVFuOeeezBt2jR8+umnsFqtuPbaazFlyhTMnTsXZrMZmzZtcndxTJo0CX379sV7770HpVKJHTt2tPjWL7+Cxvjx4/HSSy+hXbt26NmzJ7Zv344333wTd999d6DK12y4jgYREQGOwZlXXnkl5syZ4w4a3333HRISEnDFFVdAoVCgT58+7u1feOEFLFiwAD/99BOmTZv2h449Z84cGI1GfP755wgPd4Sid955B+PHj8ff//53qNVqlJeX4+qrr0bHjh0BOE737nL8+HE8+eST6NatGwCgc+fOf6g8weBX0Hj77bfx7LPP4sEHH0RRURHS0tJw3333YebMmYEqHxERXUjUekfLQpDY7XYYKioQFRkJhbrxMxknTZqEKVOm4N///je0Wi2++uor3HLLLVAoFKisrMSsWbPw888/4/Tp07BaraipqcHx43985uL+/fvRp08fd8gAgCFDhsButyM3NxdDhw7F5MmTMWbMGIwaNQojR47ETTfdhNTUVADA9OnTcc899+CLL77AyJEjceONN7oDSUvl1xiNyMhIvPXWWzh27BhqamqQl5eHF198ERqNJlDlazbsOiEiCgJJcnRfBPOfWu+49OODfvz48RBC4Oeff0ZBQQFWr17tnkH5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YbFYgv1UAmLFihUCQL1/d955pxDCMcX12WefFcnJyUKr1YoRI0aI3Nxcr32UlpaKW2+9VURERIioqChx1113iYqKCq9tdu7cKS699FKh1WpFmzZtxKuvvhqsp9jszldn1dXVYvTo0SIxMVGo1WqRkZEhpkyZUi/kt6Y681VXAMQnn3zi3qa53ocrVqwQF110kdBoNCIzM9PrGBeS36uz48ePi6FDh4q4uDih1WpFp06dxJNPPum1joYQrafO7r77bpGRkSE0Go1ITEwUI0aMcIcMIVre64uniSciIqKAueDHaBAREVHLxaBBREREAcOgQURERAHDoEFEREQBw6BBREREAcOgQURERAHDoEFEREQBw6BBREREAcOgQURERAHDoEFEfpk8eTKuvfbaUBeDiC4QDBpEREQUMAwaROTTd999h6ysLISFhSE+Ph4jR47Ek08+ic8++ww//vgjJEmCJEnIyckBABQUFOCmm25CTEwM4uLiMGHCBBw9etS9P1dLyOzZs5GYmIioqCjcf//9MJvNoXmCRBQUqlAXgIhantOnT+PWW2/Fa6+9huuuuw4VFRVYvXo1/vSnP+H48eMwGAz45JNPAABxcXGwWCwYM2YMsrOzsXr1aqhUKrz44osYO3Ysdu3aBY1GAwBYtmwZdDodcnJycPToUdx1112Ij4/HSy+9FMqnS0QBxKBBRPWcPn0aVqsVEydOREZGBgAgKysLABAWFgaTyYSUlBT39l9++SXsdjs++ugjSJIEAPjkk08QExODnJwcjB49GgCg0Wjw8ccfQ6/Xo2fPnnj++efx5JNP4oUXXoBCwQZWIjniO5uI6unTpw9GjBiBrKws3HjjjfjPf/6Dc+fONbj9zp07cfjwYURGRiIiIgIRERGIi4uD0WhEXl6e1371er37enZ2NiorK1FQUBDQ50NEocMWDSKqR6lUYunSpVi3bh2WLFmCt99+G3/961+xceNGn9tXVlaif//++Oqrr+rdl5iYGOjiElELxqBBRD5JkoQhQ4ZgyJAhmDlzJjIyMrBgwQJoNBrYbDavbfv164evv/4aSUlJiIqKanCfO3fuRE1NDcLCwgAAGzZsQEREBNLT0wP6XIgodNh1QkT1bNy4ES+//DK2bNmC48ePY/78+SguLkb37t3Rvn177Nq1C7m5uSgpKYHFYsGkSZOQkJCACRMmYPXq1cjPz0dOTg4efvhhnDhxwr1fs9mMP//5z9i3bx8WLVqE5557DtOmTeP4DCIZY4sGEdUTFRWFVatW4a233oLBYEBGRgbeeOMNXHnllRgwYABycnIwYMAAVFZWYsWKFRg2bBhWrVqFp556ChMnTkRFRQXatGmDESNGeLVwjBgxAp07d8bQoUNhMplw6623YtasWaF7okQUcJIQQoS6EEQkf5MnT0ZZWRl++OGHUBeFiIKI7ZVEREQUMAwaREREFDDsOiEiIqKAYYsGERERBQyDBhEREQUMgwYREREFDIMGERERBQyDBhEREQUMgwYREREFDIMGERERBQyDBhEREQXM/wOh2jWUZiljoQAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3394\n"
     ]
    },
    {
     "data": {
      "text/plain": "  0%|          | 0/4600 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "26f30a114ae34d96bf8711f28fe925a7"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 9 / global_step 414\n",
      "lr: 0.03\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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a+bMmSopKVFWVlZQv9POnTv1gx/8QIsWLdI111yjf/zjH/rZz36m7OxszZ49Wzt27NCNN96oP//5z7rooot07NgxvfPOO5Kk8vJyTZ8+Xffdd58KCwtlGIY2b94c0VQMADjhWE2DalxN35l9MpIjVkdUB4s6t0fnLHgrIp/9yZIJSrWdvj1du3aVzWZTamqqevbsKUn67LPPJElLlizR+PHj/cdmZWUpPz/f//jOO+/UmjVr9Oqrr2ru3Lltfsbs2bM1ffp0SdI999yj3/3ud3r33Xf1ne98J6jfadmyZRo3bpzuuOMOSdLAgQP1ySef6De/+Y1mz56t0tJSdenSRVdeeaXS09OVl5en4cOHS2oKFo2NjZo6daoyMzPlcDia/S4AgMgqPdY0StHVZshujdyihEyFhNDIkSObPa6urtb8+fM1ePBgZWRkKC0tTZ9++qlKS0tPeZ5hw4b5/3eXLl3kcDj8y2UH49NPP9WYMWOaPTdmzBjt2bNHHo9H48ePV15ens4880xde+21euaZZ1Rb2/SHmp+fr3Hjxik/P1+zZ8/Wk08+qePHjwddAwAgNHzBIsce2TqiesQixZqoT5ZMCOhYr9erKmeV0h3ppk2FdNQ37+6YP3++ioqK9MADD+iss85SSkqKvv/97592J1er1drsscViCXqTtkCkp6frvffeU3FxsdauXasFCxZo0aJF2r59uzIyMlRUVKRNmzbptdde06OPPqo77rhD27ZtU//+/U2vBQAQnNKjTcEiOzmyU9RRHSwsFktA0xFSU7BotCUq1ZYU9r1CbDZbQFu1b968WbNnz9bUqVMlNY1g7N+/P8TVnTB48GBt3ry5RU0DBw707+WRlJSkwsJCFRYWauHChcrIyND69es1bdo0WSwWjRkzRkOHDtVdd92l/v37a82aNZo3b17YfgcAQOv8IxYEi9jXr18/bdu2Tfv371daWlqbowkDBgzQSy+9pEmTJsliseiOO+4IychDW375y19q1KhRuvPOO3XNNddoy5YteuSRR/SHP/xBkvTaa6/p3//+ty655BJlZmbq9ddfl9fr1aBBg7Rt2zatW7dOhYWFSklJ0SeffKLDhw9r8ODBYasfANC2kq+DRXaEp0K4xsIE8+fPV2Jios455xx169atzWsmli1bpszMTF100UWaNGmSJkyYoPPPPz9sdZ5//vn6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HjwY6dJiVlVVlfHPf/7T+Oc//2lIMpYtW2b885//NEpKSgzDMIx7773XyMjIMF555RXjgw8+MCZPnmz079/fqKuri3DlseWnP/2p0bVrV6O4uNgoLy/3/9TW1vqPueGGG4y+ffsa69evN3bs2GEUFBQYBQUFEaw69tx2223Ghg0bjH379hkffPCBcdtttxkWi8VYu3atYRj0OJROvivEMOi1GX75y18axcXFxr59+4zNmzcbhYWFRk5OjnHo0CHDMCLf47gIFoZhGL///e+Nvn37GjabzbjggguMrVu3RrqkmPb2228bklr8zJo1yzCMpltO77jjDqNHjx6G3W43xo0bZ+zevTuyRceg1nosyVixYoX/mLq6OuNnP/uZkZmZaaSmphpTp041ysvLI1d0DPrhD39o5OXlGTabzejWrZsxbtw4f6gwDHocSt8MFvS646655hqjV69ehs1mM8444wzjmmuuMfbu3et/PdI9ZndTAABgmpi/xgIAAEQPggUAADANwQIAAJiGYAEAAExDsAAAAKYhWAAAANMQLAAAgGkIFgAAwDQECwAAYBqCBYCgzJ49W1OmTIl0GQCiFMECAACYhmABoFUvvPCChg4dqpSUFGVnZ6uwsFC33HKL/vSnP+mVV16RxWKRxWJRcXGxJKmsrEw/+MEPlJGRoaysLE2ePFn79+/3n8830rF48WJ169ZNDodDN9xwgxoaGiLzCwIIiaRIFwAg+pSXl2v69Om6//77NXXqVFVVVemdd97Rddddp9LSUjmdTq1YsUKSlJWVJbfbrQkTJqigoEDvvPOOkpKSdNddd+k73/mOPvjgA9lsNknSunXrlJycrOLiYu3fv1/XX3+9srOzdffdd0fy1wVgIoIFgBbKy8vV2NioadOmKS8vT5I0dOhQSVJKSopcLpd69uzpP/4vf/mLvF6vnnrqKVksFknSihUrlJGRoeLiYl1++eWSJJvNpj/+8Y9KTU3VkCFDtGTJEt1yyy268847lZDAACoQD/g3GUAL+fn5GjdunIYOHaqrr75aTz75pI4fP97m8e+//7727t2r9PR0paWlKS0tTVlZWaqvr9fnn3/e7Lypqan+xwUFBaqurlZZWVlIfx8A4cOIBYAWEhMTVVRUpH/84x9au3atfv/73+vXv/61tm3b1urx1dXVGjFihJ555pkWr3Xr1i3U5QKIIgQLAK2yWCwaM2aMxowZowULFigvL09r1qyRzWaTx+Npduz555+v5557Tt27d5fD4WjznO+//77q6uqUkpIiSdq6davS0tKUm5sb0t8FQPgwFQKghW3btumee+7Rjh07VFpaqpdeekmHDx/W4MGD1a9fP33wwQfavXu3jhw5IrfbrZkzZyonJ0eTJ0/WO++8o3379qm4uFg33nijvvjiC/95Gxoa9KMf/UiffPKJXn/9dS1cuFBz587l+gogjjBiAaAFh8OhjRs36qGHHpLT6VReXp4efPBBTZw4USNHjlRxcbFGjhyp6upqvf322xo7dqw2btyoW2+9VdOmTVNVVZXOOOMMjRs3rtkIxrhx4zRgwABdcsklcrlcmj59uhYtWhS5XxSA6SyGYRiRLgJA/Js9e7YqKir08ssvR7oUACHE+CMAADANwQIAAJiGqRAAAGAaRiwAAIBpCBYAAMA0BAsAAGAaggUAADANwQIAAJiGYAEAAExDsAAAAKYhWAAAANMQLAAAgGn+P9U9iMIEGwHnAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     nan\n"
     ]
    },
    {
     "data": {
      "text/plain": "  0%|          | 0/4600 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "652c7ad511144fe1a542e12ff78fdf32"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 9 / global_step 414\n",
      "lr: 0.3\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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/fSnP9WcOXN07733auvWrfr1r3+tli1baurUqdq5c6d+85vf6J///KcGDRqkixcvavPmzZKkrKwsTZo0Sc8++6zuuusu5efna/PmzbYZPgAA1zp9sUj7vs2TSVLfuAiXjcNrnk1jddlcrp6z1rrksw/NS1ZIwNX/SZs3b66AgACFhITYLuY9cuSIJGnevHm2M02SFBkZqcTERNvr+fPna8WKFfrPf/6j6dOn1/oZU6dO1aRJk2SxWPT000/rjTfe0JdffqmRI0faVdMLL7ygoUOH6umnn5YkdevWTYcOHdJzzz2nqVOnKjMzU82aNdPYsWMVFhamDh06qG/fvpIqwkhZWZnuvvtudejQQZKUkJBg1+cDAJzn0wMV3YzO4YZahVW/VrOxuPctOZugG264ocrrgoICPfHEE4qPj1dERIRCQ0N1+PBhZWZm1rmfPn362P53s2bNFB4ebrvVuj0OHz6swYMHV1k2ePBgHT16VOXl5Ro+fLg6dOig6667Tj/72c/03nvv2aZyJSYmaujQoUpISNDEiRP1j3/8Q99//73dYwAAOEfKvoow0rela89Ye92ZkWB/Xx2al1yvdS0Wi/Lz8hUWHuawNs21atasWZXXTzzxhFJTU/X888+rS5cuCg4O1k9+8pOr3lPlx1cwm0wmp9z0LCwsTLt371Z6errWrVunWbNmac6cOdqxY4ciIiKUmpqqrVu3at26dfrb3/6mP/7xj9q+fbs6derk8LEAAOrv9MUiffVtrnxMUp9I14YRrzszYjKZFBLgV++f4ABfu9av68eee5UEBATYbmVfly1btmjq1Km66667lJCQoNjYWNtTkxtDfHy8tmzZUm1M3bp1s90h1c/PT8OGDdOzzz6rffv26eTJk/rss88kVRyPwYMHa+7cudqzZ48CAgK0YsWKRhs/AKBmKfsrzooM7BSpcBc/UcXrzox4io4dO2r79u06efKkQkNDaz1r0bVrV3388ccaN26cTCaTnn766Ua9rfvvfvc7DRgwQPPnz9e9996rbdu26ZVXXtHf//53SdKqVav0zTff6NZbb1WLFi20evVqWSwWde/eXdu3b1daWppGjBih6Ohobd++XefOnVN8fHyjjR8AUDNri2ZU7xjpnP1tfEfyujMjnuKJJ56Qr6+vevbsqVatWtV6DcgLL7ygFi1aaNCgQRo3bpySk5PV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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     nan\n"
     ]
    },
    {
     "data": {
      "text/plain": "  0%|          | 0/4600 [00:00<?, ?it/s]",
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "ee04eebe8e0b424b847fe8dfbe3d0ba7"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lr: 0.001\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3845\n"
     ]
    }
   ],
   "source": [
    "for lr in [1e-2, 3e-2, 3e-1, 1e-3]:\n",
    "\n",
    "    epoch = 100\n",
    "\n",
    "    model = NeuralNetwork()\n",
    "\n",
    "    # 1. 定义损失函数 采用MSE损失\n",
    "    loss_fct = nn.MSELoss()\n",
    "    # 2. 定义优化器 采用SGD\n",
    "    # Optimizers specified in the torch.optim package\n",
    "    optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=0.9)\n",
    "\n",
    "    # 3. early stop\n",
    "    early_stop_callback = EarlyStopCallback(patience=10, min_delta=1e-3)\n",
    "\n",
    "    model = model.to(device)\n",
    "    record = training(\n",
    "        model, \n",
    "        train_loader, \n",
    "        val_loader, \n",
    "        epoch, \n",
    "        loss_fct, \n",
    "        optimizer, \n",
    "        early_stop_callback=early_stop_callback,\n",
    "        eval_step=len(train_loader)\n",
    "        )\n",
    "    print(\"lr: {}\".format(lr))\n",
    "    plot_learning_curves(record)\n",
    "    model.eval()\n",
    "    loss = evaluating(model, val_loader, loss_fct)\n",
    "    print(f\"loss:     {loss:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
